//
//  ZZCStatusDAL.swift
//  weibo
//
//  Created by zhangzuchao on 2017/4/9.
//  Copyright © 2017年 zhangZuChao. All rights reserved.
//

import UIKit

//  删除缓存的时间
let MaxTime = 7 * 24 * 3600

//  数据库访问层,用于缓存数据和网络请求微博数据
class HMStatusDAL: NSObject {
    
        //  检查本地是否有缓存数据
    class func checkCacheData(maxId: Int64, sinceId: Int64, callBack: @escaping ([[String: Any]])->()) {
        var sql = ""
        //  用户登录的id
        let userid = ZZCUserAccountViewModel.sharedViewModel.userAccount!.uid
        //  区分上拉加载的查询和下拉刷新的查询
        if maxId > 0 {
            //  上拉加载
            sql = "select * from t_statuses where statusid < \(maxId) and userid = \(userid) order by statusid desc limit 20"
        } else {
            //  下拉刷新
            sql = "select * from t_statuses where statusid > \(sinceId) and userid = \(userid) order by statusid desc limit 20"
        }
        // 1. 判断本地是否有缓存数据
        let localCacheDataArray = ZZCSqliteManager.sharedManager.selectDicArray(sql: sql)
        var tempArray = [[String: Any]]()
        //  遍历本地数据
        for localDic in localCacheDataArray {
            //  获取微博的二进制数据
            let statusDicData = localDic["status"] as! Data
            //  把微博的二进制数据进行反序列化
            let statusDic = try! JSONSerialization.jsonObject(with: statusDicData, options: []) as! [String: Any]
            //  添加到数组里面,这个数据才是首页想要展示的微博数据
            tempArray.append(statusDic)
        }
        if tempArray.count > 0 {
            //  2. 如果有缓存数据直接返回本地的缓存数据
            callBack(tempArray)
        } else {
            //  3. 如果没有缓存直接从网络加载最新的微博数据
            ZZCNetworkTools.shareTools.requestHomeData(accessToken: ZZCUserAccountViewModel.sharedViewModel.accessToken!, maxId: maxId, sinceId: sinceId) { (response, error) in
                if error != nil {
                    print("网络请求异常: \(error!)")
                    callBack(tempArray)
                    return
                }
                guard let dic = response as? [String: Any] else {
                    print("数据格式有异常")
                    callBack(tempArray)
                    return
                }
                
                //  代码执行到此,表示数据是没有问题是字典
                let statusDicArray = dic["statuses"] as! [[String: Any]]
                //  4. 网络数据请求成功后把数据缓存到本地
                cacheData(statusDicArray: statusDicArray)
                //  5. 数据缓存成功后回调最新的微博数据
                callBack(statusDicArray)
            }
        }
        
        
        
    }
    
    
    //  缓存微博数据
    class func cacheData(statusDicArray: [[String: Any]]) {
        
        //  定义sql
        let sql = "insert into T_Statuses(statusid, userid, status) values(?, ?, ?);"
        //  登录用户id
        let userId = ZZCUserAccountViewModel.sharedViewModel.userAccount!.uid
        //  保证数据一致性, 使用事务
        ZZCSqliteManager.sharedManager.inTransaction { (db, rollBack) in
            //  遍历数组字典完成数据插入
            for statusDic in statusDicArray {
                //  微博id
                let statusId = statusDic["id"] as! Int64
                //  把微博字典转成微博的json二进制数据
                let statusData = try! JSONSerialization.data(withJSONObject: statusDic, options: [])
                //  执行插入sql语句
                let result = db?.executeUpdate(sql, withArgumentsIn: [statusId, userId, statusData])
                if result == false {
                    //  数据回滚
                    //  获取指针的内容
                    rollBack?.pointee = true
                    break;
                }
                
            }
        }
        
        
    }
    
    //  清除缓存数据
    class func clearCacheData() {
        //  过期时间
        let limitDate = Date().addingTimeInterval(-Double(MaxTime))
        let dt = DateFormatter()
        dt.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //  把过期日期格式化成时间字符串
        let limitDateString = dt.string(from: limitDate)
        //  定义sql
        let sql = "delete FROM t_statuses where time < ?;"
        ZZCSqliteManager.sharedManager.inDatabase { (db) in
            //  执行sql
            let result = db?.executeUpdate(sql, withArgumentsIn: [limitDateString])
            if result == true {
                //
                print("删除成功,删除了\(db!.changes())")
            } else {
                print("删除失败")
            }
        }
        
        
    }
    
    
    
}
